# 提问：使用python计算二项分布的概率 $\binom{100}{50} (0.5)^{100}$，写出python代码

import math
from scipy import stats

# 方法一：使用 math.comb (Python 3.8+)
n = 100
k = 50
p = 0.5

probability = math.comb(n, k) * (p ** k) * ((1 - p) ** (n - k))
print(f"方法一 (math.comb): {probability:.6f}")

# 方法二：使用 scipy.stats.binom.pmf
probability = stats.binom.pmf(k, n, p)
print(f"方法二 (scipy.stats): {probability:.6f}")

# 方法三：使用 math.factorial (注意：大数阶乘可能溢出，但Python整数无限制)
probability = (math.factorial(n) / (math.factorial(k) * math.factorial(n - k))) * (p ** k) * ((1 - p) ** (n - k))
print(f"方法三 (math.factorial): {probability:.6f}")

# 方法四：使用对数计算（避免数值溢出，适用于更大数值）
log_prob = (math.log(math.comb(n, k)) + k * math.log(p) + (n - k) * math.log(1 - p))
probability = math.exp(log_prob)
print(f"方法四 (对数计算): {probability:.6f}")

probability = 1/math.sqrt(math.pi*k)
print(f"方法五 (近似计算): {probability:.6f}")
